//导入 express
const express = require('express');
//导入 formidable
const formidable = require('formidable');
//
const router = express.Router();
//导入模型文件
const BookModel = require('../models/BookModel');
//导入检查登录的中间件
const checkLogin = require('../middlewares/checkLogin');

//创建路由规则
//显示新增页面
router.get('/book/create', checkLogin, (req, res) => {
    //显示新增图书的表单
    res.render('book/create', {req, title: '新增图书'});
});

//插入数据库
router.post('/book', checkLogin, (req, res) => {
    //创建表单对象
    const form = formidable({
        //设置文件上传的目录
        uploadDir: __dirname + '/../public/upload',
        //设置保留文件的后缀
        keepExtensions: true
    });
    //图片的路径要保存在『数据库中』
    //解析表单内容
    form.parse(req, (err, fields, files) => {
        if (err) {
            console.log(err)
            return;
        }
        //目前能得到的路径
        //D:\\www\\share\\day10-mongodb\\代码\\3-图书管理\\server\\public\\upload\\69e751b00e4fe7904ef72cf00.png
        //图片的正确路径  /upload/fb8095.png
        //处理图片路径数据
        //获取下标
        let index = files.img.filepath.lastIndexOf('\\upload');
        //截取字符串
        let img = files.img.filepath.slice(index).replace(/\\/g, '/');
        //准备插入数据库的数据
        let data = {
            ...fields, //扩展运算符
            img
        }
        //将数据插入数据库
        BookModel.create(data, (err, data) => {
            if(err){
                return res.send('插入失败, 请重试~~');
            }
            //渲染 success.ejs 模板
            res.render('notice/success', 
                {msg: '添加成功', time: 3, url: '/book'});

            
        });
    });
});

//删除
router.post('/book/:id/delete',checkLogin, (req, res) => {
    //获取要删除的图书 id
    let {id} = req.params;
    //删除
    BookModel.deleteOne({_id: id}, (err, data) => {
        if(err){
            return res.render('notice/error', {msg:'删除失败, 请稍后再试~~', time: 3, url: '/book'});
        }
        //如果成功
        res.render('notice/success', {msg: '删除成功', time: 3, url: '/book'});
    })
});

//显示更新页面
router.get('/book/:id/edit', checkLogin, (req, res) => {
    //获取请求的 URL 参数  id参数
    let {id} = req.params;
    //通过 id 参数获取对应的图书数据
    BookModel.findById(id, (err, data) => {
        if(err){
            return res.render('notice/error', {msg: '获取失败', time: 3, url: '/book'})
        }
        //如果读取没有错误
        //将图书数据与修改的表单结合
        res.render('book/edit', {data, req, title: '修改图书'});
    })
})

//更新数据
router.post('/book/:id/update', checkLogin, (req, res) => {
    //获取 id 参数
    let {id} = req.params;
    //提取表单数据
    const form = formidable({
        //设置文件上传的目录
        uploadDir: __dirname + '/../public/upload',
        //设置保留文件的后缀
        keepExtensions: true
    });
    //解析表单
    form.parse(req, (err, fields, files) => {
        if (err) {
            console.log(err)
            return;
        }
        //准备数据
        let data = {...fields};

        //判断是否有图片上传
        if(files.img.size > 0){
            //表示有图片上传
            //获取下标
            let index = files.img.filepath.lastIndexOf('\\upload');
            //截取字符串
            let img = files.img.filepath.slice(index).replace(/\\/g, '/');
            //设置 data 中的图片数据
            data.img = img
        }
        //更新数据库
        BookModel.updateOne({_id: id}, data, (err, data) => {
            if(err){
                return res.render('notice/error', {msg:'更新失败, 请稍后再试~~', time: 3, url: '/book'});
            }
            //如果更新成功
            res.render('notice/success', {msg:'更新成功', time: 3, url: '/book'});
        });

    });
    
});

//查询书籍  /book?page=1   2  3
router.get('/book', checkLogin, (req, res) => {
    //读取数据库
    //1   0         10
    //2   10        10
    //3   20        10 
    //N   (N-1)10   10
    //获取查询字符串的 page 参数
    let page = req.query.page || 1;
    //通过 page 获取 skip 的值
    let skip = (page - 1) * 10;
    //获取关键字
    let keyword = req.query.keyword;
    //查询数据库  模糊查询使用正则表达式实现
    let reg = new RegExp(keyword); //   
    let condition = {name: reg};

    //计算总的页码数  Math.ceil(数据的总数 / 10);
    // count 用来统计总数
    BookModel.count(condition, (err, total) => {
        // page 为分页的页码数
        BookModel.find(condition).skip(skip).limit(10).exec((err, data) => {
            //如果读取失败, 响应失败结果 
            if(err) {
                res.status(500);
                return res.send('读取失败, 请稍后再试~~');
            }
            //计算总的页码数
            let pages = Math.ceil(total/10);
            
            //如果读取成功
            res.render('book/list', {data, pages, page, req, title: '图书列表', keyword});
        });
    });


    
});

//声明接口
router.all('/api/book', (req, res, next) => {
    //设置响应头
    res.setHeader('access-control-allow-origin', '*');
    next();
} ,async (req, res) => {
    //判断请求类型
    if(req.method.toUpperCase() !== 'GET'){
        return res.json({
            code: '0001',
            msg: '请求类型必须为 GET',
            data: {}
        })
    }
    //获取页码参数
    let page = req.query.page || 1;
    //获取关键字参数
    let keyword = req.query.keyword || '';
    //设置条件
    //查询数据库  模糊查询使用正则表达式实现
    let reg = new RegExp(keyword); //   
    let condition = {name: reg};
    //分页 每页显示 18 条
    let num = 18;//
    let skip = (page - 1) * num;

    try{
        //查询数据库中图书的总量
        let count = await BookModel.count(condition);
        //读取图书
        let books = await BookModel.find(condition).skip(skip).limit(num);
        //计算总共的页码数
        let totalPage = Math.ceil(count / num);
        //响应结果
        res.json({
            code: '0000',
            msg: '读取成功',
            data: {
                "books": books, //图书信息
                "totalPage": totalPage, //总页码数
                "page": page, //当前页码数
                "count":  count// 图书的总量
            }
        })
    }catch(e){
        return res.json({
            code: '0002',
            msg: '数据库读取异常',
            data: {}
        })
    }

});

//暴露
module.exports = router;
